package com.wondertek.onvif.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.nio.charset.Charset;
import java.util.Properties;

/**
 * 编码检查工具类
 * 用于在应用启动时检查和显示编码配置信息
 * 
 * @author wondertek
 * @version 1.0.0
 */
@Slf4j
@Component
public class EncodingChecker {

    // 手动添加log变量以解决Lombok编译问题
    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(EncodingChecker.class);

    /**
     * 应用启动完成后检查编码配置
     */
    @EventListener(ApplicationReadyEvent.class)
    public void checkEncodingOnStartup() {
        log.info("========== 编码配置检查 ==========");
        
        // 检查默认字符集
        Charset defaultCharset = Charset.defaultCharset();
        log.info("默认字符集: {}", defaultCharset.displayName());
        
        // 检查系统属性
        Properties systemProps = System.getProperties();
        
        log.info("文件编码: {}", systemProps.getProperty("file.encoding", "未设置"));
        log.info("控制台编码: {}", systemProps.getProperty("console.encoding", "未设置"));
        log.info("标准输出编码: {}", systemProps.getProperty("sun.stdout.encoding", "未设置"));
        log.info("标准错误编码: {}", systemProps.getProperty("sun.stderr.encoding", "未设置"));
        log.info("JNU编码: {}", systemProps.getProperty("sun.jnu.encoding", "未设置"));
        
        // 检查JVM参数
        String javaToolOptions = System.getenv("JAVA_TOOL_OPTIONS");
        if (javaToolOptions != null) {
            log.info("JAVA_TOOL_OPTIONS: {}", javaToolOptions);
        } else {
            log.warn("JAVA_TOOL_OPTIONS 环境变量未设置");
        }
        
        String mavenOpts = System.getenv("MAVEN_OPTS");
        if (mavenOpts != null) {
            log.info("MAVEN_OPTS: {}", mavenOpts);
        } else {
            log.warn("MAVEN_OPTS 环境变量未设置");
        }
        
        // 检查语言环境
        log.info("系统语言: {}", systemProps.getProperty("user.language", "未设置"));
        log.info("系统国家: {}", systemProps.getProperty("user.country", "未设置"));
        log.info("系统时区: {}", systemProps.getProperty("user.timezone", "未设置"));
        
        // 测试中文输出
        log.info("中文测试: ONVIF设备管理系统启动成功！");
        log.info("特殊字符测试: ①②③④⑤ αβγδε 中文测试 English Test");
        
        // 编码建议和修复指导
        if (!"UTF-8".equals(systemProps.getProperty("file.encoding"))) {
            log.warn("建议设置 -Dfile.encoding=UTF-8 JVM参数");
        }
        
        if (!"UTF-8".equals(systemProps.getProperty("sun.jnu.encoding"))) {
            log.warn("JNU编码不是UTF-8，建议设置 -Dsun.jnu.encoding=UTF-8 JVM参数");
            log.info("修复方法: 使用 start-dev-utf8.bat 启动开发服务器");
        }
        
        if (!"UTF-8".equals(defaultCharset.name())) {
            log.warn("当前默认字符集不是UTF-8，可能影响中文显示");
        }
        
        // 提供完整的编码修复建议
        if (!isUtf8Environment() || !"UTF-8".equals(systemProps.getProperty("sun.jnu.encoding"))) {
            log.info("========== 编码修复建议 ==========");
            log.info("1. 开发环境: 使用 start-dev-utf8.bat 启动");
            log.info("2. 生产环境: 使用 start-jar-utf8.bat 启动");
            log.info("3. IDE环境: 在VM options中添加以下参数:");
            log.info("   -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Dconsole.encoding=UTF-8");
            log.info("4. 确保所有源文件保存为UTF-8编码");
            log.info("=================================");
        }
        
        log.info("========== 编码检查完成 ==========");
    }
    
    /**
     * 获取编码配置摘要
     * 
     * @return 编码配置信息
     */
    public String getEncodingSummary() {
        StringBuilder summary = new StringBuilder();
        summary.append("编码配置摘要:\n");
        summary.append("默认字符集: ").append(Charset.defaultCharset().displayName()).append("\n");
        summary.append("文件编码: ").append(System.getProperty("file.encoding", "未设置")).append("\n");
        summary.append("控制台编码: ").append(System.getProperty("console.encoding", "未设置")).append("\n");
        return summary.toString();
    }
    
    /**
     * 检查是否为UTF-8编码环境
     * 
     * @return true if UTF-8 environment
     */
    public boolean isUtf8Environment() {
        return "UTF-8".equals(System.getProperty("file.encoding")) &&
               "UTF-8".equals(Charset.defaultCharset().name());
    }
}